package controlmercancias.gui.administracion;

import controlmercancias.dominio.Usuario;
import controlmercancias.gui.WaitingJFrame;
import controlmercancias.remoto.servidortren.ServidorTrenDemon;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.regex.Pattern;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class ComprobacionUsuarioAdministracion extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTextField nombreUsuario;
    private JPasswordField password;
    private JTextField ip;
    private JButton send;

    public ComprobacionUsuarioAdministracion() {
        KeyListener kl = new KeyAdapter() {

            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == '\n') {
                    send.doClick();
                }
            }
        };
        nombreUsuario = new JTextField(20);
        nombreUsuario.addKeyListener(kl);
        password = new JPasswordField(20);
        password.addKeyListener(kl);
        ip = new JTextField(10);
        ip.addKeyListener(kl);
        send = new JButton("Conectar");
        JPanel nombrePanel = new JPanel();
        nombrePanel.add(new JLabel("Nombre:"));
        nombrePanel.add(nombreUsuario);
        JPanel passwordPanel = new JPanel();
        passwordPanel.add(new JLabel("Password:"));
        passwordPanel.add(password);
        JPanel ipPanel = new JPanel();
        JPanel sendPanel = new JPanel();
        sendPanel.add(send);
        JPanel container = new JPanel();

        BoxLayout boxLayout = new BoxLayout(container, BoxLayout.Y_AXIS);
        container.setLayout(boxLayout);
        container.add(nombrePanel);
        container.add(passwordPanel);
        container.add(ipPanel);
        container.add(sendPanel);
        this.add(container);
        this.setTitle("Login administración");
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                ServidorTrenDemon.getServerGUI().setVisible(true);
            }
        });
        send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                final WaitingJFrame w = new WaitingJFrame("Iniciando sesión de administración...");
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        w.setVisible(true);
                    }
                });
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        String nombre = nombreUsuario.getText();
                        String p = "";
                        for (char s : password.getPassword()) {
                            p += s;
                        }
                        Usuario usuario = ServidorTrenDemon.getAccesoDatos().getUsuario(nombre, p);
                        if (usuario == null) {
                            JOptionPane.showMessageDialog(ComprobacionUsuarioAdministracion.this, "El usuario y/o la contraseña no son válidos", "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                        if (!usuario.isAdministrador()) {
                            JOptionPane.showMessageDialog(ComprobacionUsuarioAdministracion.this, "El usuario " + usuario.getNombre() + " no es administrador", "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                        Administrador a = new Administrador(ServidorTrenDemon.getServerGUI(), nombre.trim());
                        ComprobacionUsuarioAdministracion.this.setVisible(false);
                        ComprobacionUsuarioAdministracion.this.dispose();
                        a.setVisible(true);
                        w.setVisible(false);
                        w.setEnabled(false);
                        w.dispose();
                    }
                }).start();
            }
        });
        this.setSize(400, 200);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setIconImage(ServidorTrenDemon.appIcon);
    }

    private static boolean comprobarIp(String ip) {
        String pattern = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
        return Pattern.matches(pattern, ip);
    }
}
